package controllers;

import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import dtos.OrganizacionDto;
import play.Logger;
import play.db.jpa.Blob;
import utils.ColumnFilters;
import utils.ArcadiaConstants.TIPO_ENTIDAD;
import utils.ArcadiaConstants.TIPO_PERSONA;
import jxl.Cell;
import jxl.CellView;
import jxl.Sheet;
import jxl.Workbook;
import jxl.WorkbookSettings;
import jxl.biff.CountryCode;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.Colour;
import jxl.format.UnderlineStyle;
import jxl.read.biff.BiffException;
import jxl.write.Label;
import jxl.write.Number;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;
import models.ArcadiaLog;
import models.Arcadiano;
import models.ArcadianoNivel;
import models.ContactoEmpresa;
import models.HistorialContactoCargo;
import models.Localidad;
import models.Organizacion;
import models.OrigenDato;
import models.Rama;
import models.Rubro;
import models.Sector;
import models.Subrubro;


/**
 * This class export xls file with the output result list. 
 * @author Agustina
 *
 */
public class XLSExportHelper {
	private static final String IDENTIFICATOR_TITLE = "ID";
	private static final String OBSERVACIONES_TITLE = "OBSERVACIONES";
	private static final String FAX_TITLE = "FAX";
	private static final String MOVIL_TITLE = "MOVIL";
	private static final String TELEFONO_2_TITLE = "TELEFONO 2";
	private static final String TELEFONO_1_TITLE = "TELEFONO 1";
	private static final String MAIL_2_TITLE = "MAIL 2";
	private static final String MAIL_1_TITLE = "MAIL 1";
	private static final String HOMEPAGE_TITLE = "HOMEPAGE";
	private static final String WEB_TITLE = "WEB";
	private static final String PAIS_TITLE = "PAIS";
	private static final String PROVINCIA_TITLE = "PROVINCIA";
	private static final String LOCALIDAD_TITLE = "LOCALIDAD";
	private static final String CODIGO_POSTAL_TITLE = "CODIGO POSTAL";
	private static final String OFICINA_TITLE = "OFICINA";
	private static final String PISO_TITLE = "PISO";
	private static final String DOMICILIO_TITLE = "DOMICILIO";
	private static final String AREA_TITLE = "AREA";
	private static final String CARGO_TITLE = "CARGO";
	private static final String NOMBRE_TITLE = "NOMBRE";
	private static final String APELLIDO_TITLE = "APELLIDO";
	private static final String MARCA_COMERCIAL_TITLE = "MARCA COMERCIAL";
	private static final String TRATAMIENTO_TITLE = "TRATAMIENTO";
	private static final String EJECUTIVO_NIVEL_1_TITLE = "EJECUTIVO NIVEL 1";
	private static final String EJECUTIVO_NIVEL_2_TITLE = "EJECUTIVO NIVEL 2";
	private static final String EJECUTIVO_NIVEL_3_TITLE = "EJECUTIVO NIVEL 3";
	private static final String CONTACTO_TITLE = "CONTACTO";
	private static final String EMPRESA_REPARTICION_TITLE = "EMPRESA / REPARTICION";
	private static final String SUBRUBRO_TITLE = "SUBRUBRO";
	private static final String RUBRO_TITLE = "RUBRO";
	private static final String RAMA_TITLE = "RAMA";
	private static final String SECTOR_TITLE = "SECTOR";
	private static final String CANTIDAD_DE_REVISTAS_TITLE = "CANTIDAD DE REVISTAS";
	private static final String TIPO_DE_ENVIO_TITLE = "TIPO DE ENVIO";
	private static final String ORIGEN_TITLE = "ORIGEN";
	
	private static WritableCellFormat timesBoldUnderline;
	private static WritableCellFormat times;
	
	public static File write(String inputFile, List<OrganizacionDto> result, ColumnFilters columns) throws IOException, WriteException {
		File file = File.createTempFile(inputFile, ".xls");
		
		WorkbookSettings wbSettings = new WorkbookSettings();

		wbSettings.setLocale(new Locale("en", "EN"));

		WritableWorkbook workbook = Workbook.createWorkbook(file, wbSettings);
		workbook.createSheet(play.i18n.Messages.get("output.tab.label"), 0);
		WritableSheet excelSheet = workbook.getSheet(0);
		createLabel(excelSheet, columns);
		createContent(excelSheet, result, columns);

		workbook.write();
		workbook.close();

		return file;
	}

	private static void createLabel(WritableSheet sheet, ColumnFilters columns) throws WriteException {
		// Lets create a times font
		WritableFont times10pt = new WritableFont(WritableFont.TIMES, 10);
		// Define the cell format
		times = new WritableCellFormat(times10pt);
		// Lets automatically wrap the cells
		times.setWrap(true);

		// Create create a bold font with unterlines
		WritableFont times10ptBoldUnderline = new WritableFont(WritableFont.TIMES, 10, WritableFont.BOLD, false, UnderlineStyle.SINGLE);
		times10ptBoldUnderline.setColour(Colour.BLUE_GREY);
		
		timesBoldUnderline = new WritableCellFormat(times10ptBoldUnderline);
		timesBoldUnderline.setBorder(Border.ALL, BorderLineStyle.MEDIUM, Colour.BLUE_GREY);
		timesBoldUnderline.setBackground(Colour.GRAY_25);
		// Lets automatically wrap the cells
		timesBoldUnderline.setWrap(true);

		CellView cv = new CellView();
		cv.setFormat(times);
		cv.setFormat(timesBoldUnderline);
		cv.setAutosize(true);

		// Write headers
		int i = 0;
		
		addCaption(sheet, i, 0, IDENTIFICATOR_TITLE,8);
		i++;
		
		if (columns.EMPRESA_REPARTICION_TITLE){
			addCaption(sheet, i, 0, EMPRESA_REPARTICION_TITLE,30);
			i++;
		}
		if (columns.NOMBRE_TITLE){
			addCaption(sheet, i, 0, NOMBRE_TITLE,30);
			i++;
		}
		if (columns.APELLIDO_TITLE){
			addCaption(sheet, i, 0, APELLIDO_TITLE,30);
			i++;
		}
		if (columns.MARCA_COMERCIAL_TITLE){
			addCaption(sheet, i, 0, MARCA_COMERCIAL_TITLE,30);
			i++;
		}
		if (columns.TRATAMIENTO_TITLE){
			addCaption(sheet, i, 0, TRATAMIENTO_TITLE,10);
			i++;
		}
		if (columns.FAX_TITLE){
			addCaption(sheet, i, 0, FAX_TITLE,20);
			i++;
		}
		if (columns.MOVIL_TITLE){
			addCaption(sheet, i, 0, MOVIL_TITLE,20);
			i++;
		}
		if (columns.TELEFONO_2_TITLE){
			addCaption(sheet, i, 0, TELEFONO_2_TITLE,20);
			i++;
		}
		if (columns.TELEFONO_1_TITLE){
			addCaption(sheet, i, 0, TELEFONO_1_TITLE,20);
			i++;
		}
		if (columns.MAIL_2_TITLE){
			addCaption(sheet, i, 0, MAIL_2_TITLE,20);
			i++;
		}
		if (columns.MAIL_1_TITLE){
			addCaption(sheet, i, 0, MAIL_1_TITLE,20);
			i++;
		}
		if (columns.HOMEPAGE_TITLE){
			addCaption(sheet, i, 0, HOMEPAGE_TITLE,20);
			i++;
		}
		if (columns.WEB_TITLE){
			addCaption(sheet, i, 0, WEB_TITLE,20);
			i++;
		}
		if (columns.PAIS_TITLE){
			addCaption(sheet, i, 0, PAIS_TITLE,20);
			i++;
		}
		if (columns.PROVINCIA_TITLE){
			addCaption(sheet, i, 0, PROVINCIA_TITLE,20);
			i++;
		}
		if (columns.LOCALIDAD_TITLE){
			addCaption(sheet, i, 0, LOCALIDAD_TITLE,20);
			i++;
		}
		if (columns.CODIGO_POSTAL_TITLE){
			addCaption(sheet, i, 0, CODIGO_POSTAL_TITLE,10);
			i++;
		}
		if (columns.DOMICILIO_TITLE){
			addCaption(sheet, i, 0, DOMICILIO_TITLE,30);
			i++;
		}
		if (columns.OFICINA_TITLE){
			addCaption(sheet, i, 0, OFICINA_TITLE,10);
			i++;
		}
		if (columns.PISO_TITLE){
			addCaption(sheet, i, 0, PISO_TITLE,5);
			i++;
		}
		if (columns.AREA_TITLE){
			addCaption(sheet, i, 0, AREA_TITLE,20);
			i++;
		}
		if (columns.CARGO_TITLE){
			addCaption(sheet, i, 0, CARGO_TITLE,20);
			i++;
		}
		if (columns.EJECUTIVO_NIVEL1_TITLE){
			addCaption(sheet, i, 0, EJECUTIVO_NIVEL_1_TITLE,30);
			i++;
		}
		if (columns.EJECUTIVO_NIVEL2_TITLE){
			addCaption(sheet, i, 0, EJECUTIVO_NIVEL_2_TITLE,30);
			i++;
		}
		if (columns.EJECUTIVO_NIVEL3_TITLE){
			addCaption(sheet, i, 0, EJECUTIVO_NIVEL_3_TITLE,30);
			i++;
		}
		if (columns.SECTOR_TITLE){
			addCaption(sheet, i, 0, SECTOR_TITLE,20);
			i++;
		}
		if (columns.RAMA_TITLE){
			addCaption(sheet, i, 0, RAMA_TITLE,20);
			i++;
		}
		if (columns.RUBRO_TITLE){
			addCaption(sheet, i, 0, RUBRO_TITLE,20);
			i++;
		}
		if (columns.SUBRUBRO_TITLE){
			addCaption(sheet, i, 0, SUBRUBRO_TITLE,20);
			i++;
		}
		if (columns.ORIGEN_TITLE){
			addCaption(sheet, i, 0, ORIGEN_TITLE,20);
			i++;
		}
		if (columns.OBSERVACIONES_TITLE){
			addCaption(sheet, i, 0, OBSERVACIONES_TITLE,50);
			i++;
		}
		
	}

	private static void createContent(WritableSheet sheet, List<OrganizacionDto> outputs, ColumnFilters columns) throws WriteException, RowsExceededException {
		int i = 0;
		int j = 1;
		
		for (OrganizacionDto output : outputs) {
			i = 0;
		
			addLabel(sheet, i, j, output.id.toString());
			i++;
			if (columns.EMPRESA_REPARTICION_TITLE){
				addLabel(sheet, i, j, output.razonSocial);
				i++;
			}
			if (columns.NOMBRE_TITLE){
				addLabel(sheet, i, j, output.nombre);
				i++;
			}
			if (columns.APELLIDO_TITLE){
				addLabel(sheet, i, j, output.apellido);
				i++;
			}
			if (columns.MARCA_COMERCIAL_TITLE){
				addLabel(sheet, i, j, output.marcaComercial);
				i++;
			}
			if (columns.TRATAMIENTO_TITLE){
				addLabel(sheet, i, j, output.tratamiento);
				i++;
			}
			if (columns.FAX_TITLE){
				addLabel(sheet, i, j, output.fax);
				i++;
			}
			if (columns.MOVIL_TITLE){
				addLabel(sheet, i, j, output.celular);
				i++;
			}
			if (columns.TELEFONO_2_TITLE){
				addLabel(sheet, i, j, output.telefono);
				i++;
			}
			if (columns.TELEFONO_1_TITLE){
				addLabel(sheet, i, j, output.telefono);
				i++;
			}
			if (columns.MAIL_2_TITLE){
				addLabel(sheet, i, j, output.mail);
				i++;
			}
			if (columns.MAIL_1_TITLE){
				addLabel(sheet, i, j, output.mail);
				i++;
			}
			if (columns.HOMEPAGE_TITLE){
				addLabel(sheet, i, j, output.web);
				i++;
			}
			if (columns.WEB_TITLE){
				addLabel(sheet, i, j, output.web);
				i++;
			}
			String pais = "";
			String provincia = "";
			String localidad = "";
			if (output.localidad!=null){
				localidad = output.localidad.descripcion;
				provincia = output.localidad.provincia.descripcion;
				pais = output.localidad.provincia.pais.descripcion;
			}
				
			if (columns.PAIS_TITLE){
				addLabel(sheet, i, j, pais);
				i++;
			}
			if (columns.PROVINCIA_TITLE){
				addLabel(sheet, i, j, provincia);
				i++;
			}
			if (columns.LOCALIDAD_TITLE){
				addLabel(sheet, i, j, localidad);
				i++;
			}
			if (columns.CODIGO_POSTAL_TITLE){
				addLabel(sheet, i, j, output.cp);
				i++;
			}
			if (columns.DOMICILIO_TITLE){
				addLabel(sheet, i, j, output.domicilio);
				i++;
			}
			if (columns.OFICINA_TITLE){
				addLabel(sheet, i, j, output.oficina);
				i++;
			}
			if (columns.PISO_TITLE){
				addLabel(sheet, i, j, output.piso);
				i++;
			}
			if (columns.AREA_TITLE){
				addLabel(sheet, i, j, "");
				i++;
			}
			if (columns.CARGO_TITLE){
				addLabel(sheet, i, j, "");
				i++;
			}
			if (columns.EJECUTIVO_NIVEL1_TITLE){
				addLabel(sheet, i, j, output.ejecutivoNivel1);
				i++;
			}
			if (columns.EJECUTIVO_NIVEL2_TITLE){
				addLabel(sheet, i, j, output.ejecutivoNivel2);
				i++;
			}
			if (columns.EJECUTIVO_NIVEL3_TITLE){
				addLabel(sheet, i, j, output.ejecutivoNivel3);
				i++;
			}
			String sector = "";
			String rama = "";
			String rubro = "";
			String subrubro = "";
			if (output.sector!=null)
				sector = output.sector.descripcion;
			if (output.rama!=null)
				rama = output.rama.descripcion;
			if (output.rubro!=null)
				rubro = output.rubro.descripcion;
			if (output.subrubro!=null)
				subrubro = output.subrubro.descripcion;
			
			if (columns.SECTOR_TITLE){
				addLabel(sheet, i, j, sector);
				i++;
			}
			if (columns.RAMA_TITLE){
				addLabel(sheet, i, j, rama);
				i++;
			}
			if (columns.RUBRO_TITLE){
				addLabel(sheet, i, j, rubro);
				i++;
			}
			if (columns.SUBRUBRO_TITLE){
				addLabel(sheet, i, j, subrubro);
				i++;
			}
			String origenDato = "";
			if (output.origenDato!=null)
				origenDato = output.origenDato.nombre;
			if (columns.ORIGEN_TITLE){
				addLabel(sheet, i, j, origenDato);
				i++;
			}
			if (columns.OBSERVACIONES_TITLE){
				addLabel(sheet, i, j, output.observaciones);
				i++;
			}

			j++;
		}

	}

	private static void addCaption(WritableSheet sheet, int column, int row, String s, int width) throws RowsExceededException, WriteException {
		Label label;
		label = new Label(column, row, s, timesBoldUnderline);
		sheet.setColumnView(column, width);
		sheet.addCell(label);
	}

	private static void addNumber(WritableSheet sheet, int column, int row, BigDecimal integer) throws WriteException, RowsExceededException {
		Number number;
		number = new Number(column, row, integer.intValue(), times);
		sheet.addCell(number);
	}

	private static void addLabel(WritableSheet sheet, int column, int row, String s) throws WriteException, RowsExceededException {
		Label label;
		label = new Label(column, row, s, times);
		sheet.addCell(label);
	}

	public static void read(Blob base) throws BiffException, IOException, Exception {

		try {

			File file = base.getFile();
			WorkbookSettings wbSettings = new WorkbookSettings();
			wbSettings.setEncoding("ISO-8859-1");
			wbSettings.setLocale(new Locale("es", "ES"));
			wbSettings.setExcelDisplayLanguage("ES");
			wbSettings.setExcelRegionalSettings("ES");
			wbSettings.setCharacterSet(CountryCode.SPAIN.getValue());

			Workbook w = Workbook.getWorkbook(file, wbSettings);
			Sheet sheet = w.getSheet(0);

			int id = -1;
			int origen = -1;
			int sector = -1;
			int rama = -1;
			int rubro = -1;
			int subrubro = -1;
			int empresa = -1;
			int tratamiento = -1;
			int ejecutivoNivel1 = -1;
			int ejecutivoNivel2 = -1;
			int ejecutivoNivel3 = -1;
			int contacto = -1;
			int apellido = -1;
			int nombre = -1;
			int cargo = -1;
			int area = -1;
			int domicilio = -1;
			int piso = -1;
			int oficina = -1;
			int cp = -1;
			int localidad = -1;
			int provincia = -1;
			int pais = -1;
			int web = -1;
			int home = -1;
			int mail1 = -1;
			int mail2 = -1;
			int telefono1 = -1;
			int telefono2 = -1;
			int movil = -1;
			int fax = -1;
			int observaciones = -1;

			for (int j = 0; j < sheet.getRows(); j++) {
				Logger.info("Reading record: " + j);
				if (j == 0) {
					// se definen las columnas para evitar errores cuando
					// cambian
					// los reportes
					for (int k = 0; k < sheet.getColumns(); k++) {
						String columnaNombre = sheet.getCell(k, 0).getContents().trim().toUpperCase();
						Logger.debug("Reading column " + columnaNombre);
						if (IDENTIFICATOR_TITLE.equals(columnaNombre))
							id = k;
						if (ORIGEN_TITLE.equals(columnaNombre))
							origen = k;
						else if (TIPO_DE_ENVIO_TITLE.equals(columnaNombre))
							;
						else if (CANTIDAD_DE_REVISTAS_TITLE.equals(columnaNombre))
							;
						else if (SECTOR_TITLE.equals(columnaNombre))
							sector = k;
						else if (RAMA_TITLE.equals(columnaNombre))
							rama = k;
						else if (RUBRO_TITLE.equals(columnaNombre))
							rubro = k;
						else if (SUBRUBRO_TITLE.equals(columnaNombre))
							subrubro = k;
						else if (EMPRESA_REPARTICION_TITLE.equals(columnaNombre))
							empresa = k;
						else if (CONTACTO_TITLE.equals(columnaNombre))
							contacto = k;
						else if (TRATAMIENTO_TITLE.equals(columnaNombre))
							tratamiento = k;
						else if (EJECUTIVO_NIVEL_1_TITLE.equals(columnaNombre))
							ejecutivoNivel1 = k;
						else if (EJECUTIVO_NIVEL_2_TITLE.equals(columnaNombre))
							ejecutivoNivel2 = k;
						else if (EJECUTIVO_NIVEL_3_TITLE.equals(columnaNombre))
							ejecutivoNivel3 = k;
						else if (APELLIDO_TITLE.equals(columnaNombre))
							apellido = k;
						else if (NOMBRE_TITLE.equals(columnaNombre))
							nombre = k;
						else if (CARGO_TITLE.equals(columnaNombre))
							cargo = k;
						else if (AREA_TITLE.equals(columnaNombre))
							area = k;
						else if (DOMICILIO_TITLE.equals(columnaNombre))
							domicilio = k;
						else if (PISO_TITLE.equals(columnaNombre))
							piso = k;
						else if (OFICINA_TITLE.equals(columnaNombre))
							oficina = k;
						else if (CODIGO_POSTAL_TITLE.equals(columnaNombre))
							cp = k;
						else if (LOCALIDAD_TITLE.equals(columnaNombre))
							localidad = k;
						else if (PROVINCIA_TITLE.equals(columnaNombre))
							provincia = k;
						else if (PAIS_TITLE.equals(columnaNombre))
							pais = k;
						else if (WEB_TITLE.equals(columnaNombre))
							web = k;
						else if (HOMEPAGE_TITLE.equals(columnaNombre))
							home = k;
						else if (MAIL_1_TITLE.equals(columnaNombre))
							mail1 = k;
						else if (MAIL_2_TITLE.equals(columnaNombre))
							mail2 = k;
						else if (TELEFONO_1_TITLE.equals(columnaNombre))
							telefono1 = k;
						else if (TELEFONO_2_TITLE.equals(columnaNombre))
							telefono2 = k;
						else if (MOVIL_TITLE.equals(columnaNombre))
							movil = k;
						else if (FAX_TITLE.equals(columnaNombre))
							fax = k;
						else if (OBSERVACIONES_TITLE.equals(columnaNombre))
							observaciones = k;
					}

				} else {
					// se leen los datos
					Cell cell = null;

					String origen_string = null;
					if (origen > -1) {
						cell = sheet.getCell(origen, j);
						origen_string = cell.getContents();
					}

					String sector_string = null;
					if (sector > -1) {
						cell = sheet.getCell(sector, j);
						sector_string = cell.getContents();
					}

					String rama_string = null;
					if (rama > -1) {
						cell = sheet.getCell(rama, j);
						rama_string = cell.getContents();
					}

					String rubro_string = null;
					if (rubro > -1) {
						cell = sheet.getCell(rubro, j);
						rubro_string = cell.getContents();
					}

					String subrubro_string = null;
					if (subrubro > -1) {
						cell = sheet.getCell(subrubro, j);
						subrubro_string = cell.getContents();
					}

					String empresa_string = null;
					if (empresa > -1) {
						cell = sheet.getCell(empresa, j);
						empresa_string = cell.getContents();
					}

					String tratamiento_string = null;
					if (tratamiento > -1) {
						cell = sheet.getCell(tratamiento, j);
						tratamiento_string = cell.getContents();
					}
					
					String ejecutivoNivel1_string = null;
					if (ejecutivoNivel1 > -1) {
						cell = sheet.getCell(ejecutivoNivel1, j);
						ejecutivoNivel1_string = cell.getContents();
					}
					
					String ejecutivoNivel2_string = null;
					if (ejecutivoNivel2 > -1) {
						cell = sheet.getCell(ejecutivoNivel2, j);
						ejecutivoNivel2_string = cell.getContents();
					}
					
					String ejecutivoNivel3_string = null;
					if (ejecutivoNivel3 > -1) {
						cell = sheet.getCell(ejecutivoNivel3, j);
						ejecutivoNivel3_string = cell.getContents();
					}
					
					String apellido_string = null;
					if (apellido > -1) {
						cell = sheet.getCell(apellido, j);
						apellido_string = cell.getContents();
					}

					String nombre_string = null;
					if (nombre > -1) {
						cell = sheet.getCell(nombre, j);
						nombre_string = cell.getContents();
					}

					String cargo_string = null;
					if (cargo > -1) {
						cell = sheet.getCell(cargo, j);
						cargo_string = cell.getContents();
					}

					String area_string = null;
					if (area > -1) {
						cell = sheet.getCell(area, j);
						area_string = cell.getContents();
					}

					String domicilio_string = null;
					if (domicilio > -1) {
						cell = sheet.getCell(domicilio, j);
						domicilio_string = cell.getContents();
					}

					String piso_string = null;
					if (piso > -1) {
						cell = sheet.getCell(piso, j);
						piso_string = cell.getContents();
					}

					String oficina_string = null;
					if (oficina > -1) {
						cell = sheet.getCell(oficina, j);
						oficina_string = cell.getContents();
					}

					String cp_string = null;
					if (cp > -1) {
						cell = sheet.getCell(cp, j);
						cp_string = cell.getContents();
					}

					String localidad_string = null;
					if (localidad > -1) {
						cell = sheet.getCell(localidad, j);
						localidad_string = cell.getContents();
					}

					String provincia_string = null;
					if (provincia > -1) {
						cell = sheet.getCell(provincia, j);
						provincia_string = cell.getContents();
					}

					String pais_string = null;
					if (pais > -1) {
						cell = sheet.getCell(pais, j);
						pais_string = cell.getContents();
					}

					String web_string = null;
					if (web > -1) {
						cell = sheet.getCell(web, j);
						web_string = cell.getContents();
					}

					String home_string = null;
					if (home > -1) {
						cell = sheet.getCell(home, j);
						home_string = cell.getContents();
					}

					String mail1_string = null;
					if (mail1 > -1) {
						cell = sheet.getCell(mail1, j);
						mail1_string = cell.getContents();
					}

					String mail2_string = null;
					if (mail2 > -1) {
						cell = sheet.getCell(mail2, j);
						mail2_string = cell.getContents();
					}

					String telefono1_string = null;
					if (telefono1 > -1) {
						cell = sheet.getCell(telefono1, j);
						telefono1_string = cell.getContents();
					}

					String telefono2_string = null;
					if (telefono2 > -1) {
						cell = sheet.getCell(telefono2, j);
						telefono2_string = cell.getContents();
					}

					String movil_string = null;
					if (movil > -1) {
						cell = sheet.getCell(movil, j);
						movil_string = cell.getContents();
					}

					String fax_string = null;
					if (fax > -1) {
						cell = sheet.getCell(fax, j);
						fax_string = cell.getContents();
					}

					String observaciones_string = null;
					if (observaciones > -1) {
						cell = sheet.getCell(observaciones, j);
						observaciones_string = cell.getContents();
					}

					// se obtienen las entidades

					OrigenDato origenDato_entity = null;
					if (origen_string != null && !"".equals(origen_string.trim())) {
						origenDato_entity = getOrigenDato(origen_string);
					}

					Sector sector_entity = null;
					if (sector_string != null && !"".equals(sector_string.trim())) {
						sector_entity = getSector(sector_string);
					}
					
					Rama rama_entity = null;
					Rubro rubro_entity = null;
					Subrubro subrubro_entity = null;
					if (sector_entity != null) {
						rama_entity = null;
						if (rama_string != null && !"".equals(rama_string.trim())) {
							rama_entity = getRama(rama_string, sector_entity);
						}
						if (rama_entity != null) {
							if (rubro_string != null && !"".equals(rubro_string.trim())) {
								rubro_entity = getRubro(rubro_string, rama_entity);
							}
							if (rubro_entity != null) {
								if (subrubro_string != null && !"".equals(subrubro_string.trim())) {
									subrubro_entity = getSubRubro(subrubro_string, rubro_entity);
								}
							}
						}
					}
					String identificator = null;
					if (id > -1) {
						cell = sheet.getCell(id, j);
						identificator = cell.getContents();
					}
					
					Organizacion persona_entity = null;
					if ((apellido_string != null && !"".equals(apellido_string.trim())) && (nombre_string != null && !"".equals(nombre_string.trim()))) {
							persona_entity = getPersonaFisica(nombre_string, apellido_string, identificator);
							identificator = null;
							if (ejecutivoNivel1>-1){
								getEjecutivo(ejecutivoNivel1_string, 1, persona_entity);
							}
							if (ejecutivoNivel2>-1){
								getEjecutivo(ejecutivoNivel2_string, 2, persona_entity);
							}
							if (ejecutivoNivel3>-1){
								getEjecutivo(ejecutivoNivel3_string, 3, persona_entity);
							}
					}

					Organizacion empresa_entity = null;
					if (empresa_string != null && !"".equals(empresa_string.trim())) {
						empresa_entity = getOrganizacion(empresa_string, identificator);
						if (identificator!=null){
							if (ejecutivoNivel1>-1){
								getEjecutivo(ejecutivoNivel1_string, 1, empresa_entity);
							}
							if (ejecutivoNivel2>-1){
								getEjecutivo(ejecutivoNivel2_string, 2, empresa_entity);
							}
							if (ejecutivoNivel3>-1){
								getEjecutivo(ejecutivoNivel3_string, 3, empresa_entity);
							}
						}
					}


					String direccion = null;
					if (domicilio_string != null && !"".equals(domicilio_string.trim())) {
						direccion = domicilio_string.concat(" ");
						direccion = domicilio_string.concat(piso_string);
						direccion = domicilio_string.concat(" ");
						direccion = domicilio_string.concat(oficina_string);
						direccion = domicilio_string.concat(" ");
					}

					String organizacion_web = "";
					if (web_string != null && !"".equals(web_string.trim())) {
						organizacion_web = web_string;
					}
					if (home_string != null && !"".equals(home_string.trim())) {
						if (!"".equals(organizacion_web))
							organizacion_web = organizacion_web.concat(", ");
						organizacion_web = organizacion_web.concat(home_string);
					}

					String telefonos_organizacion = "";
					if (telefono1_string != null && !"".equals(telefono1_string.trim()))
						telefonos_organizacion = telefono1_string;

					if (telefono2_string != null && !"".equals(telefono2_string.trim())) {
						if (!"".equals(telefonos_organizacion))
							telefonos_organizacion = telefonos_organizacion.concat(", ");
						telefonos_organizacion = telefonos_organizacion.concat(telefono2_string);
					}

					String correos = "";

					if (mail1_string != null && !"".equals(mail1_string.trim())) {
						correos = correos.concat(mail1_string);
					}
					if (mail2_string != null && !"".equals(mail2_string.trim())) {
						if (!"".equals(correos))
							correos = correos.concat(", ");
						correos = correos.concat(mail2_string);
					}

					Localidad localidad_entity = null;

					if (localidad_string != null && !"".equals(localidad_string.trim()) && provincia_string != null && !"".equals(provincia_string.trim()) && pais_string != null && !"".equals(pais_string.trim())) {
						localidad_entity = getLocalidad(localidad_string, provincia_string, pais_string, cp_string);
					}

					if (persona_entity != null) {
						if (tratamiento>-1)
							persona_entity.tratamiento = tratamiento_string;

						if (localidad>-1) {
							persona_entity.localidad = localidad_entity;
							if (localidad_entity != null)
								persona_entity.cp = localidad_entity.codigopostal;
						}
						
						if (movil>-1)
							persona_entity.celular = movil_string;

						if (mail1>-1 || mail2>-1)
							persona_entity.mail = correos;

						if (tratamiento>-1 || localidad>-1 || movil>-1 || mail1>-1 || mail2>-1)
							persona_entity._save();

					}

					if (empresa_entity != null) {
						if (domicilio>-1)
							empresa_entity.domicilio = direccion;
						
						if (localidad>-1){
							empresa_entity.localidad = localidad_entity;
							if (localidad_entity != null)
								empresa_entity.cp = localidad_entity.codigopostal;
						}

						if (telefono1>-1 || telefono2>-1)
							empresa_entity.telefono = telefonos_organizacion;
						
						if (mail1>-1 || mail2>-1)
							empresa_entity.mail = correos;
						
						if (web>-1 || home>-1)
							empresa_entity.web = organizacion_web;
						
						if (fax>-1)
							empresa_entity.fax = fax_string;

						if (origen>-1)
							empresa_entity.origenDato = origenDato_entity;
						
						if (sector>-1)
							empresa_entity.sector = sector_entity;
						
						if (rama>-1)
							empresa_entity.rama = rama_entity;
						
						if (rubro>-1)
							empresa_entity.rubro = rubro_entity;
						
						if (subrubro>-1)
							empresa_entity.subrubro = subrubro_entity;

						if (observaciones>-1)
							empresa_entity.observaciones = observaciones_string;

						if (domicilio>-1 || localidad>-1 || telefono1>-1 || telefono2>-1 || mail1>-1 || mail2>-1 || web>-1 || home>-1 || fax>-1 || origen>-1
								|| sector>-1 || rama>-1 || rubro>-1 || subrubro>-1 || observaciones>-1)
							empresa_entity._save();

					}

					// se guardan las relaciones entre la organizacion y la
					// persona
					if (persona_entity != null && empresa_entity != null) {
						ContactoEmpresa contactoEmpresa = null;
						contactoEmpresa = ContactoEmpresa.find("organizacion.id = ? and contacto.id = ?", empresa_entity._key(), persona_entity._key()).first();
						String oldCargo = "";
						if (contactoEmpresa == null) {
							contactoEmpresa = new ContactoEmpresa();
							contactoEmpresa.contacto = persona_entity;
							contactoEmpresa.organizacion = empresa_entity;
						} else {
							oldCargo = contactoEmpresa.cargo;
						}
						contactoEmpresa.cargo = cargo_string;
						contactoEmpresa.area = area_string;

						if (cargo_string != null && !"".equals(cargo_string.trim())) {
							if (!cargo_string.toUpperCase().trim().equals(oldCargo.toUpperCase().trim())) {
								HistorialContactoCargo historial = new HistorialContactoCargo();
								historial.cargo = cargo_string;
								historial.fecha = new Date();
								historial._save();
								contactoEmpresa.addHistoria(historial);
							}
						}

						contactoEmpresa._save();

					}

				}
			}
			Logger.info("Finalizacion satisfactoria de la importacion de datos.");
		} catch (Exception e) {
			
			throw e;
		}
	}

	
	private static void getEjecutivo(String name, int nivel, Organizacion organizacion) {
		ArcadianoNivel arcadianoNivel = null;
		if (name!=null && !name.trim().equals("")){
			Arcadiano arcadiano = Arcadiano.find(" upper(nombre) like '" + name.toUpperCase() + "'").first();
			if (arcadiano == null) {
				arcadiano = new Arcadiano();
				arcadiano.nombre = name;
				arcadiano._save();
			} 
			arcadianoNivel = hasArcadiano(arcadiano, organizacion.arcadianos);
			if (arcadianoNivel == null) {
				arcadianoNivel = new ArcadianoNivel();
				arcadianoNivel.arcadiano = arcadiano;	
				if (organizacion.arcadianos == null)
					organizacion.arcadianos = new ArrayList<ArcadianoNivel>();
				organizacion.arcadianos.add(arcadianoNivel);
			}
			arcadianoNivel.level = nivel;
			arcadianoNivel._save();
		}
		
	}
	
	private static ArcadianoNivel hasArcadiano(Arcadiano arcadiano, List<ArcadianoNivel> arcadianos){
		for (ArcadianoNivel arc: arcadianos){
			if (arc.arcadiano.equals(arcadiano))
				return arc;
		}
		return null;
	}
	
	private static Organizacion getOrganizacion(String name, String identificator) {
		Organizacion organizacion = null;
		if (identificator!=null){
			organizacion = Organizacion.findById(new Long(identificator));
			if (organizacion!=null && !organizacion.razonSocial.equals(name.trim())){
				organizacion.razonSocial = name.trim();
				ArcadiaLog log = new ArcadiaLog();
				log.entidad = TIPO_ENTIDAD.ORGANIZACION;
				log.idEntidad = new Long(organizacion._key().toString());
				log.fecha = new Date();
				log.user = Security.getConnected();
				log.descripcion = "Modificación del nombre de la organización mediante proceso de importación de datos";
				log._save();
				organizacion.lastLogs = log;
				organizacion._save();
			}
		} else {
			String temporal = name.trim().replace("'", "''");
			organizacion = Organizacion.find("UPPER(razonSocial) like '" + temporal.toUpperCase() + "'").first();
		}
		if (organizacion == null) {
			organizacion = new Organizacion();
			organizacion.razonSocial = name.trim();
			organizacion.persona = TIPO_PERSONA.IDEAL;
			organizacion.telefono = "";
			organizacion.mail = "";
			organizacion.web = "";
			organizacion._save();

			ArcadiaLog log = new ArcadiaLog();
			log.entidad = TIPO_ENTIDAD.ORGANIZACION;
			log.idEntidad = new Long(organizacion._key().toString());
			log.fecha = new Date();
			log.user = Security.getConnected();
			log.descripcion = "Creación de la organización mediante proceso de importación de datos";
			log._save();
			organizacion.lastLogs = log;
			organizacion._save();
		}
		return organizacion;
	}

	private static OrigenDato getOrigenDato(String name) {
		String temporal = name.trim().replace("'", "''");
		OrigenDato origenDato = OrigenDato.find("UPPER(nombre) like '" + temporal.toUpperCase() + "'").first();
		if (origenDato == null) {
			origenDato = new OrigenDato();
			origenDato.nombre = name.trim();
			origenDato._save();
		}
		return origenDato;
	}

	private static String reemplazarAcentos(String palabra) {
		palabra = palabra.replace("á", "a");
		palabra = palabra.replace("é", "e");
		palabra = palabra.replace("í", "i");
		palabra = palabra.replace("ó", "o");
		palabra = palabra.replace("ú", "u");
		return palabra;
	}

	private static Localidad getLocalidad(String localidad, String provincia, String pais, String cp) {
		if (localidad != null && !"".equals(localidad.trim())) {
			localidad = reemplazarAcentos(localidad);

			if ("CAPITAL FEDERAL".equals(localidad.trim().toUpperCase())) {
				localidad = "C.A.B.A.";
				provincia = "Capital Federal";
			}

			Localidad localidadEntity = Localidad.find(
					"UPPER(descripcion) like '" + localidad.trim().toUpperCase() + "' and " + "UPPER(provincia.descripcion) like '" + provincia.trim().toUpperCase() + "' and " + "UPPER(provincia.pais.descripcion) like '" + pais.trim().toUpperCase()
							+ "'").first();

			if (localidadEntity == null && cp != null && !"".equals(cp.trim())) {

				localidadEntity = Localidad.find("UPPER(codigopostal) like '" + cp.trim().toUpperCase() + "'").first();

				return localidadEntity;
			}
		}
		return null;
	}

	private static Organizacion getPersonaFisica(String nombre, String apellido, String id) {
		Organizacion organizacion = null;
		if (id!=null && !"".equals(id.trim())){
			organizacion = Organizacion.findById(new Long(id));
			if (organizacion!= null && (!organizacion.nombre.equals(nombre.trim()) || !organizacion.apellido.equals(apellido.trim()))){
				organizacion.nombre = nombre;
				organizacion.apellido = apellido;
				ArcadiaLog log = new ArcadiaLog();
				log.entidad = TIPO_ENTIDAD.ORGANIZACION;
				log.idEntidad = new Long(organizacion._key().toString());
				log.fecha = new Date();
				log.user = Security.getConnected();
				log.descripcion = "Modificación del nombre de la organización mediante proceso de importación de datos";
				log._save();
				organizacion.lastLogs = log;
				organizacion._save();
			}
		} else {
			String temporal = nombre.trim().replace("'", "''");
			String temporal2 = apellido.trim().replace("'", "''");
			String query = "UPPER(nombre) like '" + temporal.toUpperCase() + "' and ";
			query = query.concat("UPPER(apellido) like '" + temporal2.toUpperCase() + "'");
			organizacion = Organizacion.find(query).first();			
		}

		if (organizacion == null) {
			organizacion = new Organizacion();
			organizacion.nombre = nombre.trim();
			organizacion.apellido = apellido.trim();
			organizacion.persona = TIPO_PERSONA.FISICA;
			organizacion.telefono = "";
			organizacion.mail = "";
			organizacion.web = "";
			organizacion._save();

			ArcadiaLog log = new ArcadiaLog();
			log.entidad = TIPO_ENTIDAD.ORGANIZACION;
			log.idEntidad = new Long(organizacion._key().toString());
			log.fecha = new Date();
			log.user = Security.getConnected();
			log.descripcion = "Creación de la organización mediante proceso de importación de datos";
			log._save();
			organizacion.lastLogs = log;
			organizacion._save();
		}
		return organizacion;
	}

	private static Sector getSector(String nombre) {
		String query = "UPPER(descripcion) like '" + nombre.trim().toUpperCase() + "' ";
		Sector sector = Sector.find(query).first();
		if (sector == null) {
			sector = new Sector();
			sector.descripcion = nombre.trim();
			sector._save();
		}
		return sector;
	}

	private static Rama getRama(String nombre, Sector sector) {
		String query = "UPPER(descripcion) like '" + nombre.trim().toUpperCase() + "' and sector.id = " + sector.id;
		Rama rama = Rama.find(query).first();
		if (rama == null) {
			rama = new Rama();
			rama.sector = sector;
			rama.descripcion = nombre.trim();
			rama._save();
		}
		return rama;
	}

	private static Rubro getRubro(String nombre, Rama rama) {
		String query = "UPPER(descripcion) like '" + nombre.trim().toUpperCase() + "' and rama.id = " + rama.id;
		Rubro rubro = Rubro.find(query).first();
		if (rubro == null) {
			rubro = new Rubro();
			rubro.rama = rama;
			rubro.descripcion = nombre.trim();
			rubro._save();
		}
		return rubro;
	}

	private static Subrubro getSubRubro(String subrubro, Rubro rubro) {
		String query = "UPPER(descripcion) like '" + subrubro.trim().toUpperCase() + "' and rubro.id = " + rubro.id;
		Subrubro subrubroEntity = Subrubro.find(query).first();
		if (subrubroEntity == null) {
			subrubroEntity = new Subrubro();
			subrubroEntity.rubro = rubro;
			subrubroEntity.descripcion = subrubro.trim();
			subrubroEntity._save();
		}

		return subrubroEntity;
	}
}
